/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.beautycenter.Funcionalidades;

import br.com.beautycenter.DAO.PersisteFeriado;
import br.com.beautycenter.DAO.PersisteSessao;
import br.com.beautycenter.bean.Feriado;
import br.com.beautycenter.bean.Sessao;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;

/**
 *
 * @author Magela
 */
public class Data {
    public static SimpleDateFormat formatoDataExtendida = new SimpleDateFormat("yy 'ano(s), ' MM 'mes(es) e ' dd 'dia(s)'");
    public static SimpleDateFormat formatoDataConvencional = new SimpleDateFormat("dd/MM/yyyy");
    public static SimpleDateFormat fomatoHora = new SimpleDateFormat("HH:mm:ss");
    public static SimpleDateFormat horaSimpels = new SimpleDateFormat("HH:mm");
    
    public static PersisteSessao persisteSessao = new PersisteSessao();
    
    
    /**
     * 
     * @return Verifica se ja fez aniversario
     */
    public static boolean verificarAniversario(Date dataNascimento){
        DateTime nascimento = new DateTime(dataNascimento);
        DateTime aniversario = new DateTime(new DateTime().getYear(), 
                nascimento.getMonthOfYear(), nascimento.getDayOfMonth(), 0, 0);
        if(aniversario.isBeforeNow()) return true;
        return false;
    }
    
    
    public static boolean verificarLimiteHora(Date hora, Date limiteInferior, Date limiteSuperior){
        DateFormat dFormat = DateFormat.getTimeInstance(DateFormat.SHORT, new Locale("pt", "BR"));
        String[] vHora = dFormat.format(hora).split(":");
        String[] vLimiteInferior = dFormat.format(limiteInferior).split(":");
        String[] vLimiteSuperior = dFormat.format(limiteSuperior).split(":");
        
        if(Integer.valueOf(vHora[0]) < Integer.valueOf(vLimiteInferior[0])) return false;
        else if(Integer.valueOf(vHora[0]).intValue() > Integer.valueOf(vLimiteSuperior[0]).intValue()) return false;
        else if(Integer.valueOf(vHora[0]).intValue() == Integer.valueOf(vLimiteSuperior[0]).intValue() && 
                Integer.valueOf(vHora[1]).intValue() > Integer.valueOf(vLimiteSuperior[1]).intValue()
                ) return false;
        
        return true;
    }
    
    /**
     * Verifica se duas datas são igual
     * @param data1
     * @param data2
     * @return 
     */
    public static boolean compararDatas(DateTime data1, DateTime data2){
        DateTime aux1 = new DateTime(data1.getYear(), data1.getMonthOfYear(), data1.getDayOfMonth(), 0, 0, 0);
        DateTime aux2 = new DateTime(data2.getYear(), data2.getMonthOfYear(), data2.getDayOfMonth(), 0, 0, 0);
        
        if(aux1.equals(aux2)) return true;
        return false;
    }
    
    /**
     * Verifica se data 1 é anterior ou igual a data 2.
     * @param data1
     * @param data2
     * @return 
     */
    public static boolean validarDataMaior(DateTime data1, DateTime data2){
        DateTime aux1 = new DateTime(data1.getYear(), data1.getMonthOfYear(), data1.getDayOfMonth(), 0, 0, 0);
        DateTime aux2 = new DateTime(data2.getYear(), data2.getMonthOfYear(), data2.getDayOfMonth(), 0, 0, 0);
        
        if(aux1.isAfter(aux2)) return false;
        return true;
    }
    
    /**
     * Verifica se a data passada como parâmetro é feriado ou é sábado
     * @param data
     * @return 
     */
    public static boolean isFeriadoOuSabado(Date data){
        PersisteFeriado persisteFeriado = new PersisteFeriado();
        DateTime d = new DateTime(data.getTime());
        d = new DateTime(d.year().get(), d.monthOfYear().get(), d.dayOfMonth().get(), 0, 0, 0);
        
        if(d.getDayOfWeek() == DateTimeConstants.SATURDAY) return true; //é sábado
        
        //pesquisa na lista de feriados
        for(Feriado item: persisteFeriado.retornarFeriado()){
            DateTime dItem = new DateTime(item.getDtFeriado().getTime());
            dItem = new DateTime(dItem.year().get(), dItem.monthOfYear().get(), dItem.dayOfMonth().get(), 0, 0, 0);
            
            //se for igual é um feriado
            if(d.isEqual(dItem.getMillis())){
                return true;
            }
        }
        
        return false; //não é um feriado
    }
    
    /**
     * Verifica se houve uma falta na sessão
     * @param idSessao
     * @return 
     */
    public static boolean verificarFalta(int idSessao){
        Sessao sessao = new Sessao();
        sessao.setIdSessao(idSessao);
        sessao = persisteSessao.retornarSessaoPeloID(sessao);
        
        //se a data da sessão for anterior a data atual e presença é false, então houve uma falta
        if(Validacoes.validarDataMaior(sessao.getDtSessao()) && !sessao.isPresenca()) return true;
        
        //caso contrário, não houve a falta
        return false;
    }
    
    /**
     * Retorna um vetor com 3 valores
     * 
     * retorno[0] = anos
     * retorno[1] = meses
     * retorno[2] = dias
     * 
     * @param aniversario
     * @return 
     */
    public static String retornarIdade(DateTime aniversario){
        if(aniversario == null) return "";
        
        DateTime hoje = new DateTime();
        hoje = new DateTime(hoje.getYear(), hoje.getMonthOfYear(), hoje.getDayOfMonth(), 0, 0, 0);
        aniversario = new DateTime(aniversario.getYear(), aniversario.getMonthOfYear(), 
                aniversario.getDayOfMonth(), 0, 0, 0);
        
        //define o quantidade de dias que a pessoa viveu
        int ano = hoje.getYear() - aniversario.getYear();
        
        //se o mes atual for menor que o mes do aniversario, diminui o ano em 1
        //se o mes atual for maior que o mes do aniversario, 
        //se for o mesmo mês, então mes = 0;
        int dia = 0;
        int mes = 0;
        
        if(hoje.getMonthOfYear() < aniversario.getMonthOfYear()){
            ano--;
            mes = DateTimeConstants.DECEMBER - aniversario.getMonthOfYear() + hoje.getMonthOfYear();
            //se o dia atual for menor que o dia do aniversario, então faz a conta: 
            //ultimo dia do mes - aniversario + dia de hoje
            
            //caso contrario recebe apenas hoje - aniversario
            if(hoje.getDayOfMonth() < aniversario.getDayOfMonth()){
                dia = aniversario.dayOfMonth().withMaximumValue().getDayOfMonth() - aniversario.getDayOfMonth() 
                        + hoje.getDayOfMonth();
            }else{
                dia = hoje.getDayOfMonth() - aniversario.getDayOfMonth();
            }
            
        }else if(hoje.getMonthOfYear() > aniversario.getMonthOfYear()){
            mes = hoje.getMonthOfYear() - aniversario.getMonthOfYear();
            
            //se o dia atual for menor que o dia do aniversario, então faz a conta: 
            //ultimo dia do mes - aniversario + dia de hoje
            
            //caso contrario recebe apenas hoje - aniversario
            if(hoje.getDayOfMonth() < aniversario.getDayOfMonth()){
                dia = aniversario.dayOfMonth().withMaximumValue().getDayOfMonth() - aniversario.getDayOfMonth() 
                        + hoje.getDayOfMonth();
            }else{
                dia = aniversario.getDayOfMonth() - hoje.getDayOfMonth();
            }
            
        }else{
            //se estiver no mesmo mês...verifica-se a quantidade de dias
            
            //se o dia atual for menor que o aniversário indica que ainda não foi feito aniversario, então mes = 11
            //se o dia atual for igual ao dia do aniversario indica aniversario, então mes = 0 e dia = 0;
            //se o dia atual for maior que o aniversario indica que existe alguns dias passados
            if(hoje.getDayOfMonth() < aniversario.getDayOfMonth()){
                mes = 11;
            }else if(hoje.getDayOfMonth() == aniversario.getDayOfMonth()){
                mes = 0;
                dia = 0;
            }else{
                mes = 0;
                dia = aniversario.getDayOfMonth() - hoje.getDayOfMonth();
            }
        }
        
        
        return String.valueOf(ano) + " ano(s), " + String.valueOf(mes) + " mês(es), " + String.valueOf(dia) + " dia(s)";
    }
}
